﻿///////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2023, ООО 1С-Софт
// Все права защищены. Эта программа и сопроводительные материалы предоставляются 
// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0)
// Текст лицензии доступен по ссылке:
// https://creativecommons.org/licenses/by/4.0/legalcode
///////////////////////////////////////////////////////////////////////////////////////////////////////

#Область ПрограммныйИнтерфейс

// Получить структуру с описанием формы выполнения задачи.
//
// Параметры:
//  ЗадачаСсылка - ЗадачаСсылка.ЗадачаИсполнителя
//
// Возвращаемое значение:
//   см. БизнесПроцессыИЗадачиПереопределяемый.ПриПолученииФормыВыполненияЗадачи.ПараметрыФормы
//
Функция ФормаВыполненияЗадачи(Знач ЗадачаСсылка) Экспорт
	
	ОбщегоНазначенияКлиентСервер.ПроверитьПараметр("БизнесПроцессыИЗадачиВызовСервера.ФормаВыполненияЗадачи", 
		"ЗадачаСсылка", ЗадачаСсылка, Тип("ЗадачаСсылка.ЗадачаИсполнителя"));

	Реквизиты = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(ЗадачаСсылка, "БизнесПроцесс,ТочкаМаршрута");
	Если Реквизиты.БизнесПроцесс = Неопределено ИЛИ Реквизиты.БизнесПроцесс.Пустая() Тогда
		Возврат Новый Структура();
	КонецЕсли;
	
	ТипБизнесПроцесса = Реквизиты.БизнесПроцесс.Метаданные(); // ОбъектМетаданныхБизнесПроцесс 
	ПараметрыФормы = БизнесПроцессы[ТипБизнесПроцесса.Имя].ФормаВыполненияЗадачи(ЗадачаСсылка,
		Реквизиты.ТочкаМаршрута);
	БизнесПроцессыИЗадачиПереопределяемый.ПриПолученииФормыВыполненияЗадачи(
		ТипБизнесПроцесса.Имя, ЗадачаСсылка, Реквизиты.ТочкаМаршрута, ПараметрыФормы);
	
	Возврат ПараметрыФормы;
	
КонецФункции

// Проверяет, находится ли в ячейке отчета ссылка на задачу и в параметре
// ЗначениеРасшифровки возвращает значение расшифровки.
//
// Параметры:
//  Расшифровка             - Строка - имя ячейки.
//  ДанныеРасшифровкиОтчета - Строка - адрес во временном хранилище.
//  ЗначениеРасшифровки     - ЗадачаСсылка.ЗадачаИсполнителя
//                          - Произвольный - значение расшифровки из ячейки.
// 
// Возвращаемое значение:
//  Булево - Истина, если это задача исполнителю.
//
Функция ЭтоЗадачаИсполнителю(Знач Расшифровка, Знач ДанныеРасшифровкиОтчета, ЗначениеРасшифровки) Экспорт
	
	ДанныеРасшифровкиОбъект = ПолучитьИзВременногоХранилища(ДанныеРасшифровкиОтчета); // ДанныеРасшифровкиКомпоновкиДанных
	ЗначениеРасшифровки = ДанныеРасшифровкиОбъект.Элементы[Расшифровка].ПолучитьПоля()[0].Значение;
	Возврат ТипЗнч(ЗначениеРасшифровки) = Тип("ЗадачаСсылка.ЗадачаИсполнителя");
	
КонецФункции

// Выполнить задачу ЗадачаСсылка, при необходимости выполнив обработчик.
// ОбработкаВыполненияПоУмолчанию модуля менеджера бизнес-процесса,
// к которому относится задача ЗадачаСсылка.
//
// Параметры:
//  ЗадачаСсылка        - ЗадачаСсылка
//  ДействиеПоУмолчанию - Булево       - признак необходимости вызова процедуры 
//                                       ОбработкаВыполненияПоУмолчанию у бизнес-процесса задачи.
//
Процедура ВыполнитьЗадачу(ЗадачаСсылка, ДействиеПоУмолчанию = Ложь) Экспорт
	
	НачатьТранзакцию();
	Попытка
		БизнесПроцессыИЗадачиСервер.ЗаблокироватьЗадачи(ЗадачаСсылка);
		
		СведенияЗадачи = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(ЗадачаСсылка, "Выполнена, БизнесПроцесс, ТочкаМаршрута");
		Если СведенияЗадачи.Выполнена Тогда
			ВызватьИсключение НСтр("ru = 'Задача уже была выполнена ранее.'");
		КонецЕсли;
		
		Если ДействиеПоУмолчанию 
			 И СведенияЗадачи.БизнесПроцесс <> Неопределено
			 И Не СведенияЗадачи.БизнесПроцесс.Пустая() Тогда
				ТипБизнесПроцесса = СведенияЗадачи.БизнесПроцесс.Метаданные(); // ОбъектМетаданныхБизнесПроцесс
				БизнесПроцессы[ТипБизнесПроцесса.Имя].ОбработкаВыполненияПоУмолчанию(ЗадачаСсылка,
					СведенияЗадачи.БизнесПроцесс, СведенияЗадачи.ТочкаМаршрута);
		КонецЕсли;
		
		ЗадачаОбъект = ЗадачаСсылка.ПолучитьОбъект();
		ЗадачаОбъект.Выполнена = Ложь;
		ЗадачаОбъект.ВыполнитьЗадачу();
		ЗафиксироватьТранзакцию();
	Исключение
		ОтменитьТранзакцию();
		ВызватьИсключение;
	КонецПопытки;
	
КонецПроцедуры

// Перенаправить задачи МассивЗадач новому исполнителю, указанному в структуре ИнфоОПеренаправлении.
//
// Параметры:
//  ПеренаправляемыеЗадачи - Массив из ЗадачаСсылка.ЗадачаИсполнителя
//  ИнфоОПеренаправлении   - Структура - новые значения реквизитов адресации задачи.
//  ТолькоПроверка         - Булево    - если Истина, то функция не будет выполнять
//                                       физического перенаправления задач, а только 
//                                       проверит возможность перенаправления.
//  ПеренаправленныеЗадачи - Массив из ЗадачаСсылка.ЗадачаИсполнителя - перенаправленные задачи.
//                                       Может отличаться по составу элементов от массива 
//                                       ПеренаправляемыеЗадачи, если не все задачи удалось перенаправить.
//
// Возвращаемое значение:
//   Булево   - Истина, если перенаправление выполнено успешно.
//
Функция ПеренаправитьЗадачи(Знач ПеренаправляемыеЗадачи, Знач ИнфоОПеренаправлении, Знач ТолькоПроверка = Ложь,
	ПеренаправленныеЗадачи = Неопределено) Экспорт
	
	Результат = Истина;
	
	СведенияОЗадачах = ОбщегоНазначения.ЗначенияРеквизитовОбъектов(ПеренаправляемыеЗадачи, "БизнесПроцесс,Выполнена");
	НачатьТранзакцию();
	Попытка
		Для Каждого Задача Из СведенияОЗадачах Цикл
			
			Если Задача.Значение.Выполнена Тогда
				Результат = Ложь;
				Если ТолькоПроверка Тогда
					ОтменитьТранзакцию();
					Возврат Результат;
				КонецЕсли;
			КонецЕсли;
			
			БизнесПроцессыИЗадачиСервер.ЗаблокироватьЗадачи(Задача.Ключ);
			Если ЗначениеЗаполнено(Задача.Значение.БизнесПроцесс) И Не Задача.Значение.БизнесПроцесс.Пустая() Тогда
				БизнесПроцессыИЗадачиСервер.ЗаблокироватьБизнесПроцессы(Задача.Значение.БизнесПроцесс);
			КонецЕсли;
		КонецЦикла;
		
		Если ТолькоПроверка Тогда
			Для Каждого Задача Из СведенияОЗадачах Цикл
				ЗадачаОбъект = Задача.Ключ.ПолучитьОбъект();
				ЗадачаОбъект.Выполнена = Ложь;
				ЗадачаОбъект.ДополнительныеСвойства.Вставить("Перенаправление", Истина);
				ЗадачаОбъект.ДополнительныеСвойства.Вставить("ТолькоПроверка",  Истина);
				ЗадачаОбъект.ВыполнитьЗадачу();
			КонецЦикла;
			ОтменитьТранзакцию();
			Возврат Результат;
		КонецЕсли;
		
		Для Каждого Задача Из СведенияОЗадачах Цикл
			
			Если НЕ ЗначениеЗаполнено(ПеренаправленныеЗадачи) Тогда
				ПеренаправленныеЗадачи = Новый Массив();
			КонецЕсли;
			
			// Не устанавливаем объектную блокировку на задачу Задача для того, чтобы 
			// позволить выполнять перенаправление по команде из формы этой задачи.
			ЗадачаОбъект = Задача.Ключ.ПолучитьОбъект();
			
			УстановитьПривилегированныйРежим(Истина);
			НоваяЗадача = Задачи.ЗадачаИсполнителя.СоздатьЗадачу();
			НоваяЗадача.Заполнить(ЗадачаОбъект);
			ЗаполнитьЗначенияСвойств(НоваяЗадача, ИнфоОПеренаправлении, 
				"Исполнитель,РольИсполнителя,ОсновнойОбъектАдресации,ДополнительныйОбъектАдресации");
			НоваяЗадача.Записать();
			УстановитьПривилегированныйРежим(Ложь);
		
			ПеренаправленныеЗадачи.Добавить(НоваяЗадача.Ссылка);
			
			ЗадачаОбъект.РезультатВыполнения = ИнфоОПеренаправлении.Комментарий; 
			ЗадачаОбъект.Выполнена = Ложь;
			ЗадачаОбъект.ДополнительныеСвойства.Вставить("Перенаправление", Истина);
			ЗадачаОбъект.ВыполнитьЗадачу();
			
			УстановитьПривилегированныйРежим(Истина);
			ПодчиненныеБизнесПроцессы = БизнесПроцессыИЗадачиСервер.ВыбратьБизнесПроцессыВедущейЗадачи(Задача.Ключ, Истина).Выбрать();
			УстановитьПривилегированныйРежим(Ложь);
			Пока ПодчиненныеБизнесПроцессы.Следующий() Цикл
				БизнесПроцессОбъект = ПодчиненныеБизнесПроцессы.Ссылка.ПолучитьОбъект();
				БизнесПроцессОбъект.ВедущаяЗадача = НоваяЗадача.Ссылка;
				БизнесПроцессОбъект.Записать();
			КонецЦикла;
			
			УстановитьПривилегированныйРежим(Истина);
			ПодчиненныеБизнесПроцессы = БизнесПроцессыИЗадачиСервер.БизнесПроцессыГлавнойЗадачи(Задача.Ключ, Истина);
			УстановитьПривилегированныйРежим(Ложь);
			
			Для каждого ПодчиненныйБизнесПроцесс Из ПодчиненныеБизнесПроцессы Цикл
				БизнесПроцессОбъект = ПодчиненныйБизнесПроцесс.ПолучитьОбъект();
				БизнесПроцессОбъект.ГлавнаяЗадача = НоваяЗадача.Ссылка;
				БизнесПроцессОбъект.Записать();
			КонецЦикла;
			
			ПриПеренаправленииЗадачи(ЗадачаОбъект, НоваяЗадача);
			
		КонецЦикла;
		
		ЗафиксироватьТранзакцию();
	Исключение
		ОтменитьТранзакцию();
		Результат = Ложь;
		Если Не ТолькоПроверка Тогда
			ВызватьИсключение;
		КонецЕсли;
	КонецПопытки;
	
	Возврат Результат;
	
КонецФункции

// Отмечает указанные бизнес-процессы как активные.
//
// Параметры:
//  БизнесПроцессы - Массив из ОпределяемыйТип.БизнесПроцесс
//
Процедура СделатьАктивнымБизнесПроцессы(БизнесПроцессы) Экспорт
	
	НачатьТранзакцию();
	Попытка
		БизнесПроцессыИЗадачиСервер.ЗаблокироватьБизнесПроцессы(БизнесПроцессы);
		
		Для каждого БизнесПроцесс Из БизнесПроцессы Цикл
			СделатьАктивнымБизнесПроцесс(БизнесПроцесс);
		КонецЦикла;
		
		ЗафиксироватьТранзакцию();
	Исключение
		ОтменитьТранзакцию();
		ВызватьИсключение;
	КонецПопытки;
	
КонецПроцедуры

// Отмечает указанный бизнес-процесс как активный.
//
// Параметры:
//  БизнесПроцесс - ОпределяемыйТип.БизнесПроцесс
//
Процедура СделатьАктивнымБизнесПроцесс(БизнесПроцесс) Экспорт
	
	Если ТипЗнч(БизнесПроцесс) = Тип("СтрокаГруппировкиДинамическогоСписка") Тогда
		Возврат;
	КонецЕсли;
	
	НачатьТранзакцию();
	Попытка
		БизнесПроцессыИЗадачиСервер.ЗаблокироватьБизнесПроцессы(БизнесПроцесс);
		
		Объект = БизнесПроцесс.ПолучитьОбъект();
		Если Объект.Состояние = Перечисления.СостоянияБизнесПроцессов.Активен Тогда
			
			Если Объект.Завершен Тогда
				ВызватьИсключение НСтр("ru = 'Невозможно сделать активными завершенные бизнес-процессы.'");
			КонецЕсли;
			
			Если Не Объект.Стартован Тогда
				ВызватьИсключение НСтр("ru = 'Невозможно сделать активными не стартовавшие бизнес-процессы.'");
			КонецЕсли;
			
			ВызватьИсключение НСтр("ru = 'Бизнес-процесс уже активен.'");
		КонецЕсли;
			
		Объект.Заблокировать();
		Объект.Состояние = Перечисления.СостоянияБизнесПроцессов.Активен;
		Объект.Записать(); // АПК:1327 Блокировка установлена ранее в БизнесПроцессыИЗадачиСервер.ЗаблокироватьБизнесПроцессы.
		ЗафиксироватьТранзакцию();
	Исключение
		ОтменитьТранзакцию();
		ВызватьИсключение;
	КонецПопытки;
	
КонецПроцедуры

// Отмечает указанные бизнес-процессы как остановленные.
//
// Параметры:
//  БизнесПроцессы - Массив из ОпределяемыйТип.БизнесПроцесс
//
Процедура ОстановитьБизнесПроцессы(БизнесПроцессы) Экспорт
	
	НачатьТранзакцию();
	Попытка 
		БизнесПроцессыИЗадачиСервер.ЗаблокироватьБизнесПроцессы(БизнесПроцессы);
		
		Для каждого БизнесПроцесс Из БизнесПроцессы Цикл
			ОстановитьБизнесПроцесс(БизнесПроцесс);
		КонецЦикла;
		ЗафиксироватьТранзакцию();
	Исключение
		ОтменитьТранзакцию();
		ЗаписьЖурналаРегистрации(БизнесПроцессыИЗадачиСервер.СобытиеЖурналаРегистрации(), УровеньЖурналаРегистрации.Ошибка,,, 
			ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
		ВызватьИсключение;
	КонецПопытки;
	
КонецПроцедуры

// Отмечает указанный бизнес-процесс как остановленный.
//
// Параметры:
//  БизнесПроцесс - ОпределяемыйТип.БизнесПроцесс
//
Процедура ОстановитьБизнесПроцесс(БизнесПроцесс) Экспорт
	
	Если ТипЗнч(БизнесПроцесс) = Тип("СтрокаГруппировкиДинамическогоСписка") Тогда
		Возврат;
	КонецЕсли;
	
	НачатьТранзакцию();
	Попытка
		БизнесПроцессыИЗадачиСервер.ЗаблокироватьБизнесПроцессы(БизнесПроцесс);
		
		Объект = БизнесПроцесс.ПолучитьОбъект();
		Если Объект.Состояние = Перечисления.СостоянияБизнесПроцессов.Остановлен Тогда
			
			Если Объект.Завершен Тогда
				ВызватьИсключение НСтр("ru = 'Невозможно остановить завершенные бизнес-процессы.'");
			КонецЕсли;
				
			Если Не Объект.Стартован Тогда
				ВызватьИсключение НСтр("ru = 'Невозможно остановить не стартовавшие бизнес-процессы.'");
			КонецЕсли;
			
			ВызватьИсключение НСтр("ru = 'Бизнес-процесс уже остановлен.'");
		КонецЕсли;
		
		Объект.Заблокировать();
		Объект.Состояние = Перечисления.СостоянияБизнесПроцессов.Остановлен;
		Объект.Записать(); // АПК:1327 Блокировка установлена ранее в БизнесПроцессыИЗадачиСервер.ЗаблокироватьБизнесПроцессы.
		ЗафиксироватьТранзакцию();
	Исключение
		ОтменитьТранзакцию();
		ВызватьИсключение;
	КонецПопытки;
	
КонецПроцедуры

// Отмечает указанные задачи как принятые к исполнению.
//
// Параметры:
//   Задачи - Массив из ЗадачаСсылка.ЗадачаИсполнителя
//
Процедура ПринятьЗадачиКИсполнению(Задачи) Экспорт
	
	НовыйМассивЗадач = Новый Массив();
	
	НачатьТранзакцию();
	Попытка
		БизнесПроцессыИЗадачиСервер.ЗаблокироватьЗадачи(Задачи);
		
		Для каждого Задача Из Задачи Цикл
			
			Если ТипЗнч(Задача) = Тип("СтрокаГруппировкиДинамическогоСписка") Тогда
				Продолжить;
			КонецЕсли;
			
			ЗадачаОбъект = Задача.ПолучитьОбъект();
			Если ЗадачаОбъект.Выполнена Тогда
				Продолжить;
			КонецЕсли;
			
			ЗадачаОбъект.Заблокировать();
			ЗадачаОбъект.ПринятаКИсполнению = Истина;
			ЗадачаОбъект.ДатаПринятияКИсполнению = ТекущаяДатаСеанса();
			Если НЕ ЗначениеЗаполнено(ЗадачаОбъект.Исполнитель) Тогда
				ЗадачаОбъект.Исполнитель = Пользователи.АвторизованныйПользователь();
			КонецЕсли;
			ЗадачаОбъект.Записать(); // АПК:1327 Блокировка установлена ранее в БизнесПроцессыИЗадачиСервер.ЗаблокироватьЗадачи.
			
			НовыйМассивЗадач.Добавить(Задача);
			
		КонецЦикла;
		ЗафиксироватьТранзакцию();
	Исключение
		ОтменитьТранзакцию();
		ВызватьИсключение;
	КонецПопытки;
	
	Задачи = НовыйМассивЗадач;
	
КонецПроцедуры

// Отмечает указанные задачи как не принятые к исполнению.
//
// Параметры:
//   Задачи - Массив из ЗадачаСсылка.ЗадачаИсполнителя
//
Процедура ОтменитьПринятиеЗадачКИсполнению(Задачи) Экспорт
	
	НовыйМассивЗадач = Новый Массив();
	
	НачатьТранзакцию();
	Попытка
		БизнесПроцессыИЗадачиСервер.ЗаблокироватьЗадачи(Задачи);
		
		Для каждого Задача Из Задачи Цикл
			
			Если ТипЗнч(Задача) = Тип("СтрокаГруппировкиДинамическогоСписка") Тогда 
				Продолжить;
			КонецЕсли;
			
			ЗадачаОбъект = Задача.ПолучитьОбъект();
			Если ЗадачаОбъект.Выполнена Тогда
				Продолжить;
			КонецЕсли;
			
			ЗадачаОбъект.Заблокировать();
			ЗадачаОбъект.ПринятаКИсполнению = Ложь;
			ЗадачаОбъект.ДатаПринятияКИсполнению = "00010101000000";
			Если Не ЗадачаОбъект.РольИсполнителя.Пустая() Тогда
				ЗадачаОбъект.Исполнитель = Неопределено;
			КонецЕсли;
			ЗадачаОбъект.Записать(); // АПК:1327 Блокировка установлена ранее в БизнесПроцессыИЗадачиСервер.ЗаблокироватьЗадачи.
			
			НовыйМассивЗадач.Добавить(Задача);
			
		КонецЦикла;
		ЗафиксироватьТранзакцию();
	Исключение
		ОтменитьТранзакцию();
		ВызватьИсключение;
	КонецПопытки;
	
	Задачи = НовыйМассивЗадач;
	
КонецПроцедуры

// Проверяет, является ли указанная задача ведущей.
//
// Параметры:
//  ЗадачаСсылка  - ЗадачаСсылка.ЗадачаИсполнителя
//
// Возвращаемое значение:
//   Булево
//
Функция ЭтоВедущаяЗадача(ЗадачаСсылка) Экспорт
	
	УстановитьПривилегированныйРежим(Истина);
	Результат = БизнесПроцессыИЗадачиСервер.ВыбратьБизнесПроцессыВедущейЗадачи(ЗадачаСсылка);
	Возврат НЕ Результат.Пустой();
	
КонецФункции

// Формирует список подбора для указания исполнителя в полях ввода составного типа (Пользователь и Роль).
//
// Параметры:
//  Текст - Строка - фрагмент текста для поиска возможных исполнителей.
// 
// Возвращаемое значение:
//  СписокЗначений - список подбора, содержащий возможных исполнителей.
//
Функция СформироватьДанныеВыбораИсполнителя(Текст) Экспорт
	
	ДанныеВыбора = Новый СписокЗначений;
	
	Запрос = Новый Запрос;
	Запрос.Текст = 
	"ВЫБРАТЬ РАЗРЕШЕННЫЕ
	|	Пользователи.Ссылка КАК Ссылка
	|ИЗ
	|	Справочник.Пользователи КАК Пользователи
	|ГДЕ
	|	Пользователи.Наименование ПОДОБНО &Текст СПЕЦСИМВОЛ ""~""
	|	И Пользователи.Недействителен = ЛОЖЬ
	|	И Пользователи.Служебный = ЛОЖЬ
	|	И Пользователи.ПометкаУдаления = ЛОЖЬ
	|
	|ОБЪЕДИНИТЬ ВСЕ
	|
	|ВЫБРАТЬ
	|	РолиИсполнителей.Ссылка
	|ИЗ
	|	Справочник.РолиИсполнителей КАК РолиИсполнителей
	|ГДЕ
	|	РолиИсполнителей.Наименование ПОДОБНО &Текст СПЕЦСИМВОЛ ""~""
	|	И НЕ РолиИсполнителей.ПометкаУдаления";
	Запрос.УстановитьПараметр("Текст", ОбщегоНазначения.СформироватьСтрокуДляПоискаВЗапросе(Текст) + "%");
	
	Выборка = Запрос.Выполнить().Выбрать();
	Пока Выборка.Следующий() Цикл
		ДанныеВыбора.Добавить(Выборка.Ссылка);
	КонецЦикла;
	
	Возврат ДанныеВыбора;
	
КонецФункции

#КонецОбласти

#Область СлужебныеПроцедурыИФункции

// Возвращаемое значение:
//  Число
//
Функция КоличествоНевыполненныхЗадачБизнесПроцессов(БизнесПроцессы) Экспорт
	
	МассивБизнесПроцессов = Новый Массив;
	Для каждого БизнесПроцесс Из БизнесПроцессы Цикл
		Если ТипЗнч(БизнесПроцесс) = Тип("СтрокаГруппировкиДинамическогоСписка") Тогда
			Продолжить;
		КонецЕсли;
		МассивБизнесПроцессов.Добавить(БизнесПроцесс);
	КонецЦикла;
		
	Если МассивБизнесПроцессов.Количество() = 0 Тогда
		Возврат 0;
	КонецЕсли;

	Запрос = Новый Запрос(
		"ВЫБРАТЬ
		|	КОЛИЧЕСТВО(*) КАК Количество
		|ИЗ
		|	Задача.ЗадачаИсполнителя КАК Задачи
		|ГДЕ
		|	Задачи.БизнесПроцесс В (&БизнесПроцессы)
		|	И Задачи.Выполнена = ЛОЖЬ");

	Запрос.УстановитьПараметр("БизнесПроцессы", МассивБизнесПроцессов);
	Возврат Запрос.Выполнить().Выгрузить()[0].Количество;
	
КонецФункции

// Возвращаемое значение:
//  Число
//
Функция КоличествоНевыполненныхЗадачБизнесПроцесса(БизнесПроцесс) Экспорт
	
	Возврат КоличествоНевыполненныхЗадачБизнесПроцессов(ОбщегоНазначенияКлиентСервер.ЗначениеВМассиве(БизнесПроцесс));
	
КонецФункции

// Возвращаемое значение:
//  - БизнесПроцессСсылка
//  - Неопределено
//
Функция ПометитьНаУдалениеБизнесПроцессы(ВыделенныеСтроки) Экспорт
	
	Количество = 0;
	Для Каждого СтрокаТаблицы Из ВыделенныеСтроки Цикл
		БизнесПроцессСсылка = СтрокаТаблицы.Владелец;
		Если БизнесПроцессСсылка = Неопределено ИЛИ БизнесПроцессСсылка.Пустая() Тогда
			Продолжить;
		КонецЕсли;
		НачатьТранзакцию();
		Попытка
			БизнесПроцессыИЗадачиСервер.ЗаблокироватьБизнесПроцессы(БизнесПроцессСсылка);
			БизнесПроцессОбъект = БизнесПроцессСсылка.ПолучитьОбъект();
			БизнесПроцессОбъект.УстановитьПометкуУдаления(НЕ БизнесПроцессОбъект.ПометкаУдаления);
			ЗафиксироватьТранзакцию();
		Исключение
			ОтменитьТранзакцию();
			ВызватьИсключение;
		КонецПопытки;
		
		Количество = Количество + 1;
	КонецЦикла;
	Возврат ?(Количество = 1, ВыделенныеСтроки[0].Владелец, Неопределено);
КонецФункции

Процедура ПриПеренаправленииЗадачи(ЗадачаОбъект, НоваяЗадачаОбъект) 
	
	Если ЗадачаОбъект.БизнесПроцесс = Неопределено Или ЗадачаОбъект.БизнесПроцесс.Пустая() Тогда
		Возврат;
	КонецЕсли;
	
	ПодключенныеБизнесПроцессы = Новый Соответствие;
	ПодключенныеБизнесПроцессы.Вставить(Метаданные.БизнесПроцессы.Задание.ПолноеИмя(), "");
	БизнесПроцессыИЗадачиПереопределяемый.ПриОпределенииБизнесПроцессов(ПодключенныеБизнесПроцессы);
	
	ТипБизнесПроцесса = ЗадачаОбъект.БизнесПроцесс.Метаданные();
	СведенияОБизнесПроцессе = ПодключенныеБизнесПроцессы[ТипБизнесПроцесса.ПолноеИмя()];
	Если СведенияОБизнесПроцессе <> Неопределено Тогда 
		БизнесПроцессы[ТипБизнесПроцесса.Имя].ПриПеренаправленииЗадачи(ЗадачаОбъект.Ссылка, НоваяЗадачаОбъект.Ссылка);
	КонецЕсли;
	
КонецПроцедуры

#КонецОбласти